package com.JdkProxy.secondexample.pojo;

import com.JdkProxy.secondexample.utils.TimingUtils;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

/**
 * @User c.c
 * @Since 2022/11/25
 * @Time 9:17
 * @Description
 */

public class StuInvocationHandler<T> implements InvocationHandler {
  //invocationHandler持有的被代理对象
  T target;

  public StuInvocationHandler(T target) {
    this.target = target;
  }

  /**
   * proxy:代表动态代理对象
   * method：代表正在执行的方法
   * args：代表调用目标方法时传入的实参
   */
  public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
    System.out.println("代理对象执行方法:"+method.getName());
    //计时
    TimingUtils.start();
    Object invoke = method.invoke(target, args);
    TimingUtils.end(method.getName());

    System.err.println(proxy.getClass().getName());
    return invoke;
  }
}
